画布 1
进程管理
  进程的引入
    顺序程序
      程序的一次执行过程称为一次计算,它由许多简单的操作组成
      一个计算中的若干操作必须按照严格的先后顺序执行,在一次计算的执行中,计算中的各个操作要一个操作一个操作地依次执行.同样,计算也是一次执行的,只有前面的计算做完了,下一个计算才能接着做
      顺序性- 处理机的操作严格按照程序所规定的顺序依次执行
      封闭性- 程序一旦开始执行,就不会收到外界因素的影响
      可再现性- 程序执行的结构和它执行的速度无关
    并发程序
      若干个程序段同时在系统中运行，这些程序段的执行在时间上是重叠的，一个程序段的执行尚未结束，另一个程序段的执行已经开始，即使这种重叠是很小的一部分，也称这几个程序段是并发执行的。
      并发语句记号:
cobegin
S1,S2,S3...Sn
coend
      特点
        失去封闭性和可再现性-两个并发程序若干操作的先后顺序
        一个程序可以对应多个计算
        多个计算之间会有并发执行的相互制约
  进程概念
    定义
      所谓进程，就是一个程序在给定活动空间和初始环境下,在一个处理机上的一次执行过程。
就是程序的一次执行就叫做进程.
    特点
      动态性
        动态性:进程可以动态创建,也可以动态结束
        并发性:可以被调度并占处理机运行
        独立性:不同进程互不影响
        制约性:不用的进程因访问共享资源进程间同步而制约
    进程与程序的区别
      ① 程序是静态的概念(存储在内存/外存的代码)，进程是动态的概念(程序在处理机运行的过程,是运行中的程序)；
      ② 进程是一个独立运行的活动单位；
      ③ 进程是竞争系统资源的基本单位；
      ④ 一个程序可以对应多个进程，一个进程至少包含一个程序。
    进程的基本状态
      状态转换图(要记得)
      三种基本状态
        运行:该进程已获得运行所必需的资源，它的程序正在处理机上执行。
        等待:进程正等待着某一事件的发生而暂时停止执行。这时，即使给它CPU控制权，它也无法执行。
        就绪:进程已获得除CPU之外的运行所必需的资源，一旦得到CPU控制权，立即可以运行。
      转移
        就绪->执行:进程调度即可就绪状态转为运行状态
        等待->就绪:处于等待状态的进程中相关服务完成或者相关资源获得完成
        运行->等待:进程提出某种服务请求,比如说I/O
        运行->就绪:只有分时有,时间片到
        等待状态由于需要等待某种服务完成,所以说不可以被进程调度调用.
      进程基本状态的拓展
        拓展1:程序执行完了,进程还可以被回收.
        拓展2:添加挂起操作,添加静止状态,静止表示当前进程不在主存里面,在虚存里面.
        Unix进程,运行态分成用户态运行和核心态运行.
    进程描述
      进程的组成
        进程控制块:描述进程与其他进程、系统资源的关系,以及进程所处的状态
          进程标志性
          进程的状态
          进程队列的指针next
          进程优先级,家族联系,现场保护区
        进程内部的程序和数据
      进程的组织
        就绪队列,所有处于就绪状态的队列
        等待队列,有多个,每个队列表示所有因为同个某种原因而等待的进程
        运行指针,当前是什么进程正在运行
  进程控制
    进程创建
      create (name，priority)
        name为标识符
        priority是优先级
      实现方法
        查PCB总链,是否出现同名现象.
        向系统申请一个空PCB,没有空PCB就退出
        将入口信息填入PCB
        PCB入就绪队列
    进程撤销
      kill(),exit()
      实现方法
        由运行指针获得当前进程pid
        释放本进程资源给父进程
        从总链摘下
        释放PCB结构
    进程等待
      susp(chan)
        chan:进程等待的原因
      实现方法
        保护CPU现场
        置该进程为等待状态
        将该进程的PCB结构插入到对应的等待队列中
    进程唤醒
      wakeup(chan)
        chan:进程等待的原因
      实现方法
        找到chan对应的等待队列
        将首进程移除等待队列,将该进程插入到就绪队列,改变状态
  进程的相互制约关系
    临界资源
      一次只允许一个进程使用的资源
        硬件:输入机,打印机,磁带机
        软件:公共变量
    临界区
      对于公共变量(存储器)修改的程序段
    进程互斥
      在操作系统中，当某一进程正在访问某一存储区域时，就不允许其他进程来读出或者修改存储区的内容
    进程同步
      并发进程在一些关键点上可能需要互相等待与互通消息， 这种相互制约的等待与互通消息称为进程同步。
  进程同步机构
    锁
      用一个变量w代表某种资源的状态
        w=1,资源被占用
        w=0,资源没有被占用
      上锁原语lock(w)
        执行到lock的时候判断w是多少
        如果w=1,就被阻塞,进程无法往下继续运行,直到什么时候w=0.
        如果w=0,不会被阻塞,进程可以继续执行,并且会把w赋值为1
      开锁原语unlock(w)
        执行到unlock的时候,把w赋值为0即可.
    信号灯
      信号灯是一个确定的二元组 (s，q)，s是一个具有非负初值的整型变量，q是一个初始状态为空的队列。操作系统利用信号灯的状态对并发进程和共享资源进行控制和管理。在处理信号灯操作的时候,就是对那个整型变量进行处理.
      一般来说就是声明一个变量,在进行P-V操作的时候就把信号灯变量当作参数传进P-V操作里面.P-V操作就会更改变量的值
      P操作
        先把信号灯变量的值-1
        如果相减的结果为负,进程阻塞,插入到信号灯的对应的等待队列里面
        相减的结果非负,继续运行
      V操作
        信号灯变量值+1
        信号灯的结果不为正,则从信号灯等待队列中取出一个元素放入就绪队列
      信号灯数值的意义
        s>0,表示还可以允许多少个进程访问资源
        s<0,|s|表示有多少个进程正在等待
  进程互斥与同步的实现
    进程互斥的做法
      对于每一个锁,进入临界区之前上锁,离开临界区的时候解锁即可(回忆,临界区就是对公共变量进行处理的代码段)
      对于一个临界区有一个临界信号灯管理,进入临界区就P(s),离开临界区就V(s)
      语法检查
        信号灯的初值为非负整数
        除初始化外，仅能由P、V原语对信号灯进行操作
        P、V操作一定成对出现
        P操作在前，V操作在后
    两类同步问题的解法
      进程流图
        表示进程之间执行的先后次序,某些进程的完成代表某些进程可以开始执行的顺序
        可以用多个信号灯表示,在每个进程前面加上若干个P操作,在每个进程后面加上若干个V操作
        其中V操作用于通知其他进程本进程已经执行完毕(相当于消息发送者)
        P操作用于接受上一层V操作发送来的消息
        假如说有一个关系p1->p2,p1执行完了才能执行p2,那么就有一个信号灯,初值为0,在p2的开始加上P操作,p1的末尾加上V操作,有多少对这样的关系就有多少个信号灯
      共享缓冲区
        问题概述:有两个进程,一个负责读,一个负责写
        可以转化成进程流图,只有读完了,才能写,只能写完了,才能读.则规定两个信号灯,一个在读进程头P操作,在写进程尾V操作,一个在写进程头P操作,在读进程尾V操作.
当然还可以用两个信号灯表示空闲数和占用数,占用数大于0,可以读取,空闲数大于0,可以写
        写进程
          p(sb)
            sb代表缓冲区的空位置数,初值为1
          数据放入buf
          v(sa)
            sa代表缓冲区的数据数,初值为0
        读进程
          p(sa)
          取数据
          v(sb)
      生产者消费者
        若干个进程往一定量的容器里面放东西,若干个进程往一定量容器里面写东西
        信号灯设置
          两个同步信号灯——
            sb ：表示空缓冲区的数目，初值 = n
            sa ： 表示满缓冲区 (即信息)的数目，初值 = 0
          一个互斥信号灯
            mutex：表示有界缓冲区是否被占用，初值 = 1
        生产者:
          p(sb)表示空缓冲区少1,如果没有的话就阻塞
          p(mutex)进入临界区
          v(mutex)退出临界区
          v(sa)写完,信息数+1
        消费者:
          p(sa)表示信息数-1
          v(sb)读完,空闲区+1
        玩意生产者或者消费者不愿意等待了怎么办?
          可以用一个共享变量p来表示剩余资源或者是占用的资源数量.对这个p用P-V操作保护,用if-else语句表达判断,如果不可以就直接释放进程.而不是P操作.
  Unix/Linux关于进程的系统调用
    fork()
      创建一个新的进程,父子两个进程共享fork()后面的代码,父子进程同时从fork()函数返回返回值开始一块往下运行.
      对于父进程,函数返回值是子进程的pid,对于子进程,函数返回值是0,然后父子进程并行投入运行,都从fork()函数返回返回值开始继续往下运行
    exit()
      该进程结束执行
    wait(&pid)
      该进程需要等待号码为pid的进程结束才继续执行
  P操作
    本质上会让某种元素-1
    并且某种元素数量不为正数的话就不能运行
  V操作
    本质上会让某种元素+1
    还有一点,关于变量的处理不一定需要PV操作,可以加临界区
  mutex
    只要用临界区就在临界区的首尾加上P和V